package com.ds.bintree.LeetCode;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * @author Dianzhi Han
 * @version 1.0
 * @description: 颜色标记法（中序遍历为例子）
 * 其核心思想如下：
 *
 *     使用颜色标记节点的状态，新节点为白色，已访问的节点为灰色。
 *     如果遇到的节点为白色，则将其标记为灰色，然后将其右子节点、自身、左子节点依次入栈。
 *     如果遇到的节点为灰色，则将节点的值输出。
 *
 * @date 2022/9/20 15:56
 */
public class TreeTraversalCommon {
    class ColorNode {
        TreeNode node;
        String color;

        public ColorNode(TreeNode node,String color){
            this.node = node;
            this.color = color;
        }
    }
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if(root == null) return res;
        Stack<ColorNode> stack = new Stack<>();
        stack.push(new ColorNode(root,"white"));

        while(!stack.empty()){
            ColorNode cn = stack.pop();
//中序遍历为例子，如果需要前序或者后序只需要更改入栈的顺序即可，倒着入栈
            if(cn.color.equals("white")){
                if(cn.node.right != null) stack.push(new ColorNode(cn.node.right,"white"));
                stack.push(new ColorNode(cn.node,"gray"));
                if(cn.node.left != null)stack.push(new ColorNode(cn.node.left,"white"));
            }else{
                res.add(cn.node.val);
            }
        }
        return res;
    }
}
